"""
Spider评估使用的数据模型
"""
from pydantic import BaseModel
from typing import List, Dict, Any, Optional

class Column(BaseModel):
    """数据库列模型"""
    name: str
    type: str
    description: str
    enum_values: Optional[Dict[str, str]] = None

class Table(BaseModel):
    """数据库表模型"""
    name: str
    columns: List[Column]
    description: Optional[str] = None

class DatabaseSchema(BaseModel):
    """数据库模式模型"""
    name: Optional[str] = None
    tables: List[Table]

class EvaluationResult(BaseModel):
    """评估结果模型"""
    question: str  # 原始自然语言问题
    generated_sql: str  # 模型生成的SQL查询语句
    correct_sql: str  # 数据集中的标准SQL查询语句
    syntax_match: bool  # SQL语法层面是否匹配（通过规范化SQL后比较）
    execution_match: bool  # 执行结果是否匹配（通过比较查询结果）
    db_id: str  # 数据库ID，指明查询针对的是哪个数据库
    normalized_generated: str  # 规范化处理后的生成SQL（移除空格、大小写统一等）
    normalized_correct: str  # 规范化处理后的标准SQL
    complexity: int = 1  # 查询复杂度: 1=基础(单表无条件), 2=简单(单表简单条件), 3=中等(简单JOIN或聚合), 4=复杂(多表JOIN、GROUP BY), 5=高级(嵌套、复杂聚合)
    response_time: float = 0.0  # 模型生成SQL的响应时间(秒)
    second_execution: bool = False  # 是否进行了二次执行
    improved_by_second: bool = False  # 是否通过二次执行改善了结果

class EvaluationSummary(BaseModel):
    """评估摘要模型"""
    accuracy: float  # 总体准确率（正确查询数/总查询数）
    correct: int  # 正确查询数量
    total: int  # 总查询数量
    results: List[EvaluationResult]  # 所有评估结果的详细列表
    complexity_accuracy: Dict[str, Any] = {}  # 按复杂度分类的准确率统计，包含每类的准确率、样本数和平均响应时间
    second_execution_stats: Dict[str, Any] = {}  # 二次执行的统计信息，包括触发次数、改善次数、触发率和改善率



